home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / modules / loadilbm.c < prev    next >
C/C++ Source or Header  |  1992-05-18  |  5KB  |  212 lines

  1. /* loadilbm.c - C. Scheppner CBM
  2.  *
  3.  * High-level ILBM load routines
  4.  *
  5.  * 37.9  04/92 - use vp->ColorMap.Count instead of MAXAMCOLORREG
  6.  */
  7. #define INTUI_V36_NAMES_ONLY
  8.  
  9. #include "iffp/ilbm.h"
  10. #include "iffp/ilbmapp.h"
  11.  
  12. extern struct Library *GfxBase;
  13.  
  14. /* loadbrush
  15.  *
  16.  * Passed an initialized ILBMInfo with a not-in-use ParseInfo.iff
  17.  *   IFFHandle and desired propchks, collectchks, and stopchks, and filename,
  18.  *   will load an ILBM as a brush, setting up ilbm->Bmhd, ilbm->camg,
  19.  *   ilbm->brbitmap, ilbm->colortable, and ilbm->ncolors
  20.  *
  21.  *   Note that ncolors may be more colors than you can LoadRGB4.
  22.  *   Use MIN(ilbm->ncolors,vp->ColorMap->Count) for color count if
  23.  *   you change the colors yourself using 1.3/2.0 functions.
  24.  *
  25.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  26.  */
  27.  
  28. LONG loadbrush(struct ILBMInfo *ilbm, UBYTE *filename)
  29. {
  30. LONG error = 0L;
  31.  
  32.     if(!(ilbm->ParseInfo.iff))    return(CLIENT_ERROR);
  33.  
  34.     if(!(error = openifile((struct ParseInfo *)ilbm, filename, IFFF_READ)))
  35.     {
  36.     error = parseifile((struct ParseInfo *)ilbm,
  37.                 ID_FORM, ID_ILBM,
  38.                 ilbm->ParseInfo.propchks,
  39.                 ilbm->ParseInfo.collectchks,
  40.                 ilbm->ParseInfo.stopchks);
  41.     if((!error)||(error == IFFERR_EOC)||(error == IFFERR_EOF))
  42.         {
  43.         if(contextis(ilbm->ParseInfo.iff,ID_ILBM,ID_FORM))
  44.         {
  45.             if(error = createbrush(ilbm))   deletebrush(ilbm);
  46.         }
  47.         else
  48.         {
  49.         message(SI(MSG_IFFP_NOILBM));
  50.         error = NOFILE;
  51.         }
  52.         }
  53.     if(error)    closeifile((struct ParseInfo *)ilbm);
  54.     }
  55.     return(error);
  56. }
  57.  
  58.  
  59. /* unloadbrush
  60.  *
  61.  * frees and close everything alloc'd/opened by loadbrush
  62.  */
  63. void unloadbrush(struct ILBMInfo *ilbm)
  64. {
  65.     deletebrush(ilbm);
  66.     closeifile((struct ParseInfo *)ilbm);
  67. }
  68.  
  69.  
  70. /* queryilbm
  71.  *
  72.  * Passed an initilized ILBMInfo with a not-in-use IFFHandle,
  73.  *   and a filename,
  74.  *   will open an ILBM, fill in ilbm->camg and ilbm->bmhd,
  75.  *   and close the ILBM.
  76.  *
  77.  * This allows you to determine if the ILBM is a size and
  78.  *   type you want to deal with.
  79.  *
  80.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  81.  */
  82.  
  83. /* query just wants these chunks */
  84. LONG queryprops[] = { ID_ILBM, ID_BMHD,
  85.               ID_ILBM, ID_CAMG,
  86.                       TAG_DONE };
  87.  
  88. /* scan can stop when a CMAP or BODY is reached */
  89. LONG querystops[] = { ID_ILBM, ID_CMAP,
  90.               ID_ILBM, ID_BODY,
  91.               TAG_DONE };
  92.  
  93. LONG queryilbm(struct ILBMInfo *ilbm, UBYTE *filename)
  94. {
  95. LONG error = 0L;
  96. BitMapHeader *bmhd;
  97.  
  98.     if(!(ilbm->ParseInfo.iff))    return(CLIENT_ERROR);
  99.  
  100.     if(!(error = openifile((struct ParseInfo *)ilbm, filename, IFFF_READ)))
  101.     {
  102.     D(bug("queryilbm: openifile successful\n"));
  103.  
  104.     error = parseifile((struct ParseInfo *)ilbm,
  105.             ID_FORM, ID_ILBM,
  106.             queryprops, NULL, querystops);
  107.  
  108.     D(bug("queryilbm: after parseifile, error = %ld\n",error));
  109.  
  110.     if((!error)||(error == IFFERR_EOC)||(error == IFFERR_EOF))
  111.         {
  112.         if(contextis(ilbm->ParseInfo.iff,ID_ILBM,ID_FORM))
  113.         {
  114.         if(bmhd = (BitMapHeader*)
  115.             findpropdata(ilbm->ParseInfo.iff,ID_ILBM,ID_BMHD))
  116.             {
  117.             *(&ilbm->Bmhd) = *bmhd;
  118.             ilbm->camg = getcamg(ilbm);
  119.             }
  120.         else error = NOFILE;
  121.         }
  122.         else
  123.         {
  124.         message(SI(MSG_IFFP_NOILBM));
  125.         error = NOFILE;
  126.         }
  127.         }
  128.     closeifile(ilbm);
  129.     }
  130.     return(error);
  131. }
  132.  
  133.  
  134. /* loadilbm
  135.  *
  136.  * Passed a not-in-use IFFHandle, an initialized ILBMInfo, and filename,
  137.  *   will load an ILBM into your already opened ilbm->scr, setting up
  138.  *   ilbm->Bmhd, ilbm->camg, ilbm->colortable, and ilbm->ncolors
  139.  *   and loading the colors into the screen's viewport
  140.  *
  141.  *   Note that ncolors may be more colors than you can LoadRGB4.
  142.  *   Use MIN(ilbm->ncolors,vp->ColorMap->Count) for color count if
  143.  *   you change the colors yourself using 1.3/2.0 functions.
  144.  *
  145.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  146.  *
  147.  * NOTE - loadilbm() keeps the IFFHandle open so you can copy
  148.  *   or examine other chunks.  You must call closeifile(iff,ilbm)
  149.  *   to close the file and deallocate the parsed context
  150.  *
  151.  */
  152.  
  153. LONG loadilbm(struct ILBMInfo *ilbm, UBYTE *filename)
  154. {
  155. LONG error = 0L;
  156.  
  157.  
  158.     D(bug("loadilbm:\n"));
  159.  
  160.     if(!(ilbm->ParseInfo.iff))    return(CLIENT_ERROR);
  161.     if(!ilbm->scr)        return(CLIENT_ERROR);
  162.  
  163.     if(!(error = openifile((struct ParseInfo *)ilbm, filename, IFFF_READ)))
  164.     {
  165.     D(bug("loadilbm: openifile successful\n"));
  166.  
  167.     error = parseifile((struct ParseInfo *)ilbm,
  168.             ID_FORM, ID_ILBM,
  169.             ilbm->ParseInfo.propchks,
  170.             ilbm->ParseInfo.collectchks,
  171.             ilbm->ParseInfo.stopchks);
  172.  
  173.     D(bug("loadilbm: after parseifile, error = %ld\n",error));
  174.  
  175.     if((!error)||(error == IFFERR_EOC)||(error == IFFERR_EOF))
  176.         {
  177.         if(contextis(ilbm->ParseInfo.iff,ID_ILBM,ID_FORM))
  178.         {
  179.             error = loadbody(ilbm->ParseInfo.iff,
  180.                     &ilbm->scr->BitMap, &ilbm->Bmhd);
  181.  
  182.         D(bug("loadilbm: after loadbody, error = %ld\n",error));
  183.  
  184.         if(!error)
  185.             {
  186.             if(!(getcolors(ilbm)))
  187.                 LoadRGB4(&ilbm->scr->ViewPort,ilbm->colortable,
  188.             MIN(ilbm->ncolors,ilbm->scr->ViewPort.ColorMap->Count));
  189.             } 
  190.         }
  191.         else
  192.         {
  193.         message(SI(MSG_IFFP_NOILBM));
  194.         error = NOFILE;
  195.         }
  196.         }
  197.     if(error)    closeifile((struct ParseInfo *)ilbm);
  198.     }
  199.     return(error);
  200. }
  201.  
  202.  
  203. /* unloadilbm
  204.  *
  205.  * frees and closes everything allocated by loadilbm
  206.  */
  207. void unloadilbm(struct ILBMInfo *ilbm)
  208. {
  209.     closeifile((struct ParseInfo *)ilbm);
  210.     freecolors(ilbm);
  211. }
  212.